home *** CD-ROM | disk | FTP | other *** search
/ The Best of MacTutor - S…e Code for Volumes 1 to 5 / The Best of MacTutor - Source Code for Volume 1-5 (Wayzata Technology)(6031)(1990).bin / Source Code / #29 (Feb 88) / Rotate Source Code / rot4Edit ƒ / rot4Edit.p < prev    next >
Text File  |  1988-01-02  |  4KB  |  161 lines

  1. PROGRAM rot4Edit;
  2.  
  3. {
  4. ••••••••••••••••••••••••••••••••••
  5.     rot2Edit by John D. Olsen
  6. idea by Scott Boyd, Greg Marriott
  7.           and John Olsen
  8.                 for
  9.         MacTutor Magazine
  10.             © Jan 1988
  11. ••••••••••••••••••••••••••••••••••
  12. }
  13.  
  14. uses
  15.     {$LOAD pinterfaces.dump}        
  16.     MemTypes,QuickDraw,OsIntf,PasLibIntf,
  17.     ToolIntf,PackIntf,IntEnv,CursorCtl;
  18.  
  19. type
  20.     integerPtr = ^INTEGER;
  21. var
  22.     item: Handle;
  23.     itemHit, invertItem : INTEGER;
  24.     map1, map2, map3, map4 : bitMap;
  25.     rect1, rect2, rect3, rect4 : rect;
  26.     
  27.     
  28. FUNCTION NewPtrClear( theSize: size ) : Ptr; EXTERNAL;
  29.     
  30. PROCEDURE Rotate( srcMap, destMap : BitMap ); EXTERNAL;
  31.     
  32. PROCEDURE NewBitMapClear( VAR theBitMap : BitMap );
  33.     BEGIN
  34.     WITH theBitMap, bounds DO
  35.         BEGIN
  36.             rowBytes := ((right - left + 15) DIV 16) * 2;
  37.             baseAddr := NewPtrClear(rowBytes * (bottom - top));
  38.             IF MemError <> noErr then baseAddr := NIL;
  39.         END;
  40.     END;
  41.         
  42.  
  43.  
  44. FUNCTION filterProc(theDialog: DialogPtr; VAR theEvent: EventRecord; VAR itemHit: INTEGER): BOOLEAN;
  45.         CONST
  46.             EnterKey = $03;
  47.             BackspaceKey = $08;
  48.             TabKey = $09;
  49.             ReturnKey = $0D;
  50.             ClearKey = $1B;
  51.             DeleteKey = $7F;
  52.  
  53.             {bits of the event modifiers long word}
  54.             CommandBit = 8;
  55.  
  56.     VAR
  57.         itemNum: INTEGER;
  58.         kind: INTEGER;
  59.         box: Rect;
  60.         charCode: INTEGER;
  61.         theChar: Char;
  62.         dialog: DialogPtr;
  63.  
  64. VAR
  65.     noteDialog : DialogPtr;
  66.     itemType : integer;
  67.  
  68.     BEGIN
  69.     filterProc := FALSE;
  70.  
  71.     CASE theEvent.what OF
  72.         nullEvent:
  73.             BEGIN    { 2, 3, 4, 5 }
  74.                 GetDItem(theDialog, 2, kind, item, box);
  75.                 GetDItem(theDialog, 3, kind, item, rect2);
  76.                 GetDItem(theDialog, 4, kind, item, rect3);
  77.                 GetDItem(theDialog, 5, kind, item, rect4);
  78.                 CopyBits( thePort^.portBits, map1, box, map1.bounds, srcCopy, nil);
  79.                 Rotate( map1, map2 );
  80.                 Rotate( map2, map3 );                
  81.                 Rotate( map3, map4 );                
  82.                 CopyBits( map2, thePort^.portBits, map2.bounds, rect2, srcCopy, nil);
  83.                 CopyBits( map3, thePort^.portBits, map3.bounds, rect3, srcCopy, nil);
  84.                 CopyBits( map4, thePort^.portBits, map4.bounds, rect4, srcCopy, nil);
  85.                 DisposPtr( map2.baseAddr );
  86.                 DisposPtr( map3.baseAddr );
  87.                 DisposPtr( map4.baseAddr );                
  88.             END;
  89.         keyDown, autoKey:
  90.             BEGIN
  91.             charCode := BAND(theEvent.message, charCodeMask);
  92.             IF charCode IN [EnterKey] THEN 
  93.                 BEGIN    
  94.                 itemHit := 1;
  95.                 filterProc := true;
  96.                 EXIT(filterProc);
  97.                 END;
  98.             IF charCode IN [ClearKey] THEN
  99.                 BEGIN
  100.                 IF theEvent.what = keyDown THEN DlgDelete(theDialog);
  101.                 theEvent.what := nullEvent;
  102.                 EXIT(filterProc)
  103.                 END;
  104.             IF BTST(theEvent.modifiers, CommandBit) THEN
  105.                 BEGIN
  106.                 theChar := CHR(charCode);
  107.                 CASE theChar OF
  108.                     'X','x': IF theEvent.what = keyDown THEN DlgCut(theDialog);
  109.                     'C','c': IF theEvent.what = keyDown THEN DlgCopy(theDialog);
  110.                     'V','v': IF theEvent.what = keyDown THEN DlgPaste(theDialog);
  111.                     OTHERWISE ;
  112.                 END;
  113.                 theEvent.what := nullEvent;
  114.                 EXIT(filterProc);
  115.                 END;
  116.             END;
  117.     END;
  118.     END;
  119.  
  120. PROCEDURE EditThatSucker;
  121. type
  122.     strHandle = ^strPtr;
  123.     strPtr = ^Str255;
  124. var
  125.     noteDialog : DialogPtr;
  126.     itemType : integer;
  127.     item : handle;
  128.     box : rect;
  129. BEGIN
  130. {Bring up the window}
  131.     noteDialog := GetNewDialog( 1000, NIL, windowPtr(-1) );
  132.     showWindow(noteDialog);
  133.     SetPort(noteDialog);
  134.  
  135.     getDItem(noteDialog, 2, itemType, item, box);
  136.     map1.bounds := box;
  137.     NewBitMapClear( map1 );
  138.     
  139.     
  140.     InitCursor;
  141.     repeat
  142.         ModalDialog(@filterProc, itemHit);
  143.     until itemHit = 1;
  144.     
  145.     DisposDialog(noteDialog);
  146. END;{EditThatSucker}
  147.  
  148. BEGIN {main}
  149.     InitGraf(@thePort);
  150.     BEGIN
  151.         InitFonts;
  152.         InitWindows;
  153.         InitMenus;
  154.         TEInit;
  155.         InitDialogs(nil);
  156.     END;
  157.  
  158.     invertItem := 1;
  159.     EditThatSucker;
  160.     
  161. END.